home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Archive / Funny Stuff / BouncyWorld.lha / BouncyWorld / BouncyWorld.c < prev    next >
C/C++ Source or Header  |  1995-03-09  |  29KB  |  1,039 lines

  1. /************************************************************************
  2. *                                                                        *
  3. *                                BOUNCYWORLD                                *
  4. *                                                                        *
  5. * Copyright ©1995 Nick Christie.                                        *
  6. * All rights reserved.                                                    *
  7. * nick.christie@computing-services.oxford.ac.uk                            *
  8. *                                                                        *
  9. * Tab size = 4                                                            *
  10. *                                                                        *
  11. * Get a sprite and animate it as a ball that rolls around the view,        *
  12. * bouncing off the sides and subject to friction. The ball can be        *
  13. * "shoved" with the mouse pointer.                                        *
  14. *                                                                        *
  15. * TODO:                                                                    *
  16. * 1. Use VB server to animate sprite instead of WaitTOF(), then main    *
  17. *        loop just Wait()s for IDCMP.                                    *
  18. * 2. Get the sprite to "roll" in the direction it is travelling.        *
  19. *                                                                        *
  20. * To compile with SAS/C 6.51 (using supplied SCOPTIONS):                *
  21. * sc BouncyWorld.c                                                        *
  22. * slink FROM LIB:c.o BouncyWorld.o TO BouncyWorld LIB LIB:scm.lib        *
  23. *    LIB:sc.lib LIB:amiga.lib SC SD NOICONS                                *
  24. *                                                                        *
  25. *************************************************************************/
  26.  
  27. /************************************************************************
  28. ******************************  INCLUDES  *******************************
  29. *************************************************************************/
  30.  
  31. #include "BouncyWorld.h"
  32.  
  33. /************************************************************************
  34. *****************************  DEFINITIONS  *****************************
  35. *************************************************************************/
  36.  
  37. #define SPRNUMBER        2
  38. #define SPRINITX        20
  39. #define SPRINITY        20
  40. #define SPRINITSPEED    5
  41. #define SPRINITTHETA    (7*PI/4)
  42. #define SPRWIDTH        16
  43. #define SPRHEIGHT        16
  44. #define SPRCOLLMASK        (1<<9)
  45. #define SPRFRAMECOUNT    6
  46.  
  47. #define PEN21RED        15
  48. #define PEN21GREEN        15
  49. #define PEN21BLUE        15
  50. #define PEN22RED        0
  51. #define PEN22GREEN        7
  52. #define PEN22BLUE        14
  53. #define PEN23RED        0
  54. #define PEN23GREEN        10
  55. #define PEN23BLUE        6
  56.  
  57. #define DEFFRICTION        0.995
  58. #define DEFBOUNCE        0.7
  59. #define DEFFORCE        0.2
  60.  
  61. #define VIEWWIDTH        320
  62. #define VIEWHEIGHT        256
  63.  
  64. #define GAD_FRICTION    0
  65. #define GAD_BOUNCE        1
  66. #define GAD_FORCE        2
  67. #define GAD_TOTAL        3
  68.  
  69. #define MENU_PROJECT    0
  70. #define ITEM_ABOUT        0
  71. #define ITEM_NEW        1
  72. #define ITEM_QUIT        2
  73.  
  74. /*
  75.  * Definitions for CreateGadgetList program system
  76.  */
  77.  
  78. #define GADPROG_DONE        0
  79. #define GADPROG_CONTEXT        1
  80. #define GADPROG_LEFT        2
  81. #define GADPROG_TOP            3
  82. #define GADPROG_WIDTH        4
  83. #define GADPROG_HEIGHT        5
  84. #define GADPROG_TEXT        6
  85. #define GADPROG_GID            7
  86. #define GADPROG_FLAGS        8
  87. #define GADPROG_TATTR        9
  88. #define GADPROG_KIND        10
  89. #define GADPROG_TAGPTR        11
  90. #define GADPROG_CREATE        12
  91.  
  92. struct GadProgItem {
  93.     UWORD    gpi_Tag;        /* one of above defines */
  94.     ULONG    gpi_Data;        /* data pertinent to action */
  95. };
  96.  
  97. /************************************************************************
  98. *************************  EXTERNAL REFERENCES  *************************
  99. *************************************************************************/
  100.  
  101. extern struct Custom far custom;            /* from amiga.lib */
  102. extern void exit(ULONG);                    /* from SAS c.o */
  103.  
  104. /************************************************************************
  105. *****************************  PROTOTYPES  ******************************
  106. *************************************************************************/
  107.  
  108. void main(void);
  109. void HandleGadget(struct Gadget *gad,UWORD code);
  110. BOOL HandleMenu(UWORD code);
  111.  
  112. void EnableNewItem(void);
  113. void DisableNewItem(void);
  114.  
  115. char *OpenAll(void);
  116. BOOL CreateGadgetList(struct GadProgItem *pc,APTR vi);
  117. void CloseAll(char *);
  118.  
  119. void MoveBall(void);
  120.  
  121. /************************************************************************
  122. ********************************  DATA  *********************************
  123. *************************************************************************/
  124.  
  125. /*
  126.  * Library bases
  127.  */
  128.  
  129. struct IntuitionBase    *IntuitionBase = NULL;
  130. struct GfxBase            *GfxBase = NULL;
  131. struct Library            *GadToolsBase = NULL;
  132.  
  133. /*
  134.  * I want topaz-8 for text
  135.  */
  136.  
  137. struct TextAttr TopazAttr = {
  138.     "topaz.font",8,FS_NORMAL,FPF_ROMFONT|FPF_DESIGNED
  139. };
  140.  
  141. /*
  142.  * For the "About" requester:
  143.  */
  144.  
  145. struct EasyStruct EasyAbout = {
  146.     sizeof(struct EasyStruct), 0, "About...",
  147.     "BouncyWorld V1.0 by Nick Christie (09/01/94)\n"
  148.     "nick.christie@computing-services.oxford.ac.uk", "Okay" };
  149.  
  150. char VersionString[] = "$VER: BouncyWorld 1.00 (09.01.94)";
  151.  
  152. /*
  153.  * Window data
  154.  */
  155.  
  156. WORD ZoomBox[] = { 80, 40, 240, 11 };
  157.  
  158. struct TagItem WindowTags[] = {
  159.     WA_Left,        80,
  160.     WA_Top,            40,
  161.     WA_Width,        240,
  162.     WA_Height,        60,
  163.     WA_MaxHeight,    60,
  164.     WA_IDCMP,        IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|\
  165.                     SLIDERIDCMP|IDCMP_MENUPICK,
  166.     WA_Flags,        WFLG_SMART_REFRESH|WFLG_CLOSEGADGET|\
  167.                     WFLG_DRAGBAR|WFLG_DEPTHGADGET,
  168.     WA_Title,        (ULONG) "BouncyWorld",
  169.     WA_Zoom,        (ULONG) ZoomBox,
  170.     TAG_DONE };
  171.  
  172. struct Screen        *ScreenLock = NULL;
  173. APTR                VisualInfo = NULL;
  174. struct Menu            *MainMenu = NULL;
  175. struct Window        *MainWindow = NULL;
  176. struct MsgPort        *MainIPort;
  177. ULONG                MainISigs;
  178. struct Gadget        *MainGList = NULL;
  179. struct Gadget        *MainGadgets[GAD_TOTAL];
  180. BOOL                MainGadgetsAdded = FALSE;
  181.  
  182. /*
  183.  * Data for the creation of menus by gadtools.
  184.  */
  185.  
  186. struct NewMenu MainNewMenu[] = {
  187.     NM_TITLE, "Project", 0, 0, 0, 0,
  188.     NM_ITEM, "About...", "A", 0, 0, 0,
  189.     NM_ITEM, "New", "N", NM_ITEMDISABLED, 0, 0,
  190.     NM_ITEM, "Quit", "Q", 0, 0, 0,
  191.     NM_END
  192. };
  193.  
  194. /*
  195.  * Tag lists for gadtools gadget creation.
  196.  */
  197.  
  198. struct TagItem SliderTags[] = {
  199.     GTSL_Min,            0,
  200.     GTSL_Max,            100,
  201.     GTSL_LevelFormat,    (ULONG) "%3ld%%",
  202.     GTSL_MaxLevelLen,    5,
  203.     GTSL_LevelPlace,    PLACETEXT_RIGHT,
  204.     GA_RelVerify,        TRUE,
  205.     PGA_Freedom,        LORIENT_HORIZ,
  206.     TAG_DONE
  207. };
  208.  
  209. struct TagItem FrictionTags[] = {
  210.     GTSL_Level,            100 - ((DEFFRICTION-0.9)*1000),
  211.     TAG_MORE,            (ULONG) SliderTags
  212. };
  213.  
  214. struct TagItem BounceTags[] = {
  215.     GTSL_Level,            DEFBOUNCE*100,
  216.     TAG_MORE,            (ULONG) SliderTags
  217. };
  218.  
  219. struct TagItem ForceTags[] = {
  220.     GTSL_Level,            DEFFORCE*100,
  221.     TAG_MORE,            (ULONG) SliderTags
  222. };
  223.  
  224. /*
  225.  * Gadtools gadget creation "program" for window.
  226.  */
  227.  
  228. struct GadProgItem MainGadgetProg[] = {
  229.  
  230.     GADPROG_CONTEXT,    (ULONG) &MainGList,
  231.  
  232.     GADPROG_LEFT,        80,
  233.     GADPROG_TOP,        16,
  234.     GADPROG_WIDTH,        110,
  235.     GADPROG_HEIGHT,        11,
  236.     GADPROG_TEXT,        (ULONG) "Friction",
  237.     GADPROG_GID,        GAD_FRICTION,
  238.     GADPROG_FLAGS,        PLACETEXT_LEFT|NG_HIGHLABEL,
  239.     GADPROG_TATTR,        (ULONG) &TopazAttr,
  240.     GADPROG_KIND,        SLIDER_KIND,
  241.     GADPROG_TAGPTR,        (ULONG) FrictionTags,
  242.     GADPROG_CREATE,        (ULONG) &MainGadgets[GAD_FRICTION],
  243.  
  244.     GADPROG_TOP,        30,
  245.     GADPROG_TEXT,        (ULONG) "Bounce",
  246.     GADPROG_GID,        GAD_BOUNCE,
  247.     GADPROG_TAGPTR,        (ULONG) BounceTags,
  248.     GADPROG_CREATE,        (ULONG) &MainGadgets[GAD_BOUNCE],
  249.  
  250.     GADPROG_TOP,        44,
  251.     GADPROG_TEXT,        (ULONG) "Force",
  252.     GADPROG_GID,        GAD_FORCE,
  253.     GADPROG_TAGPTR,        (ULONG) ForceTags,
  254.     GADPROG_CREATE,        (ULONG) &MainGadgets[GAD_FORCE],
  255.  
  256.     GADPROG_DONE
  257. };
  258.  
  259. /*
  260.  * I need to watch & react to the mouse pointer...
  261.  */
  262.  
  263. WORD    MouseX,MouseY,MouseDX,MouseDY;
  264.  
  265. /*
  266.  * Sprite Data
  267.  */
  268.  
  269. BOOL    GotSprite = FALSE;
  270. BOOL    SprAlive = TRUE;
  271. BOOL    SprDead = FALSE;
  272. double    SprX = SPRINITX;
  273. double    SprY = SPRINITY;
  274. double    SprSpeed = SPRINITSPEED;
  275. double    SprTheta = SPRINITTHETA;
  276. double    Friction = DEFFRICTION;
  277. double    Bounce = DEFBOUNCE;
  278. double    Force = DEFFORCE;
  279.  
  280. UWORD chip Ball00SprData[] = {
  281.     0x0000,0x0000,
  282.     0x3c0 ,0x400 ,0x7c0 ,0x1930,0xfc0 ,0x3bf8,0x7e4 ,0x7e1c,
  283.     0x3f80,0x47fc,0x2600,0xdffe,0x4e2 ,0xff1e,0x200 ,0xfffe,
  284.     0xf86 ,0xfffe,0xf86 ,0xfefe,0x2784,0x5e7c,0x1300,0x6ffc,
  285.     0x178 ,0x3f80,0xfb0 ,0x1040,0x380 ,0x440 ,0x0   ,0x0   ,
  286.     0x0000,0x0000 };
  287.  
  288. UWORD chip Ball01SprData[] = {
  289.     0x0000,0x0000,
  290.     0x3c0 ,0x400 ,0xf80 ,0x1270,0x3f88,0x37f8,0x1ecc,0x7d3c,
  291.     0x7e14,0x1ffc,0xac06,0x5ffe,0x1c4 ,0xfe3e,0x880 ,0xff7e,
  292.     0x1e0e,0xfffe,0x1e0e,0xf9fe,0xe0c ,0x79f8,0x2604,0x5ffc,
  293.     0x2f8 ,0x3f08,0x1f70,0x80  ,0x680 ,0x140 ,0x0   ,0x0   ,
  294.     0x0000,0x0000 };
  295.  
  296. UWORD chip Ball02SprData[] = {
  297.     0x0000,0x0000,
  298.     0x780 ,0x40  ,0x1f10,0x4f0 ,0x3e18,0x2ff8,0x3d8c,0x7a78,
  299.     0x7c2c,0x3ff8,0xb00e,0x7ffc,0x271a,0xf8fe,0x1006,0xfffe,
  300.     0x7c3e,0xfffe,0x7c3e,0xf7fe,0x1c1c,0x73e0,0x181c,0x7ff8,
  301.     0x5f0 ,0x3e18,0x1ef0,0x100 ,0x740 ,0x80  ,0x0   ,0x0   ,
  302.     0x0000,0x0000 };
  303.  
  304. UWORD chip Ball03SprData[] = {
  305.     0x0000,0x0000,
  306.     0x780 ,0x40  ,0x1e30,0x9f0 ,0x3d38,0x3ef0,0x7e5c,0x61f4,
  307.     0x781c,0x7fe0,0xe03e,0xfffa,0x8e26,0xf1fe,0x440a,0xfbfe,
  308.     0xf078,0xfffe,0xf07c,0xcffe,0x787c,0x67c0,0x303c,0x7fe0,
  309.     0xae0 ,0x3d38,0x1cf0,0x300 ,0x540 ,0x280 ,0x0   ,0x0   ,
  310.     0x0000,0x0000 };
  311.  
  312. UWORD chip Ball04SprData[] = {
  313.     0x0000,0x0000,
  314.     0x740 ,0x80  ,0x1c70,0x13e0,0x3a78,0x3de0,0x6cfc,0x53ec,
  315.     0x617c,0x7fc4,0x807e,0xffe6,0x38d8,0xc7fe,0x30  ,0xfffe,
  316.     0xe1f0,0xfffe,0xe1f8,0x3ffe,0x60e8,0x1f94,0x6078,0x7fc4,
  317.     0x35c8,0x3a70,0x19f0,0x600 ,0x6c0 ,0x100 ,0x0   ,0x0   ,
  318.     0x0000,0x0000 };
  319.  
  320. UWORD chip Ball05SprData[] = {
  321.     0x0000,0x0000,
  322.     0x740 ,0x80  ,0x18f0,0x7c0 ,0x35f8,0x3bc0,0x58fc,0x279c,
  323.     0x42fc,0x7f9c,0x1fe ,0xffde,0xf136,0xffe ,0x2054,0xdffe,
  324.     0x83c0,0xfffe,0x83e0,0xfffe,0x41c0,0x3e3c,0x1e0 ,0x7f9c,
  325.     0xa90 ,0x35e8,0x13f0,0xc00 ,0x2c0 ,0x500 ,0x0   ,0x0   ,
  326.     0x0000,0x0000 };
  327.  
  328. UWORD chip Ball06SprData[] = {
  329.     0x0000,0x0000,
  330.     0x6c0 ,0x100 ,0x10f0,0xf90 ,0x2bf8,0x3788,0x65fc,0x1f7c,
  331.     0x1fc ,0x7e3c,0x3fe ,0xff3e,0xc6cc,0x3ffe,0x818c,0x7ffe,
  332.     0xf82 ,0xfffe,0xfc2 ,0xfffe,0x7c4 ,0x7c38,0x3c0 ,0x7e3c,
  333.     0x3528,0xbd0 ,0x6f0 ,0x1900,0x580 ,0x240 ,0x0   ,0x0   ,
  334.     0x0000,0x0000 };
  335.  
  336. UWORD chip Ball07SprData[] = {
  337.     0x0000,0x0000,
  338.     0x6c0 ,0x100 ,0x1f0 ,0x1f30,0x17f8,0x2e18,0x4ffc,0x3efc,
  339.     0x17f8,0x7c7c,0xff8 ,0xfefe,0x9ba ,0xfffe,0x2a8 ,0xfffe,
  340.     0x1e02,0xfffc,0x1f04,0xfffe,0xe9c ,0x7964,0x784 ,0x7c7c,
  341.     0x2a58,0x17a0,0xce0 ,0x1310,0x5c0 ,0x200 ,0x0   ,0x0   ,
  342.     0x0000,0x0000 };
  343.  
  344. UWORD chip Ball08SprData[] = {
  345.     0x0000,0x0000,
  346.     0x580 ,0x240 ,0x3e0 ,0x1f70,0xff0 ,0x3c38,0xff8 ,0x79fc,
  347.     0x2ff0,0x79fc,0x1ff4,0xf9fa,0x3662,0xfffc,0xc66 ,0xfff8,
  348.     0x7c10,0xfffe,0x7e18,0xfffe,0x1c28,0x63dc,0x1e08,0x79fc,
  349.     0x34b0,0xf48 ,0x18c0,0x730 ,0x340 ,0x480 ,0x0   ,0x0   ,
  350.     0x0000,0x0000 };
  351.  
  352. UWORD chip Ball09SprData[] = {
  353.     0x0000,0x0000,
  354.     0x580 ,0x240 ,0x7c0 ,0x1ef0,0x1fe0,0x3978,0x5fe0,0x77fc,
  355.     0x1fe4,0x63f8,0x7fc8,0xf7f6,0xcdd0,0xfffe,0x1548,0xfff6,
  356.     0xf010,0xffee,0xf820,0xfffe,0x7c54,0x43b8,0x3c10,0x63fc,
  357.     0x2960,0x1e98,0x1180,0xe70 ,0x380 ,0x440 ,0x0   ,0x0   ,
  358.     0x0000,0x0000 };
  359.  
  360. UWORD chip Ball10SprData[] = {
  361.     0x0000,0x0000,
  362.     0x300 ,0x4c0 ,0xf80 ,0x1cf0,0x3fc8,0x32f8,0x7fc0,0x6ffc,
  363.     0x7f8c,0x47f0,0xffa4,0xcfda,0x3310,0xffee,0x6330,0xffce,
  364.     0xe080,0xfffe,0xf0c0,0xfffe,0x69e8,0x1674,0x7864,0x47f8,
  365.     0x33c0,0x3c38,0x310 ,0x1ce0,0x6c0 ,0x100 ,0x0   ,0x0   ,
  366.     0x0000,0x0000 };
  367.  
  368. UWORD chip Ball11SprData[] = {
  369.     0x0000,0x0000,
  370.     0x340 ,0x480 ,0x1f10,0x18e0,0x3f98,0x25f0,0x7f84,0x1ffc,
  371.     0x7f1c,0x1fe4,0xfe4c,0x3fb2,0xee80,0xfffe,0xaa40,0xffbe,
  372.     0x8082,0xff7e,0xc102,0xfffe,0x4280,0x3dfc,0x6088,0x1ff4,
  373.     0x780 ,0x3878,0x730 ,0x18c0,0x700 ,0xc0  ,0x0   ,0x0   ,
  374.     0x0000,0x0000 };
  375.  
  376. UWORD chip Ball12SprData[] = {
  377.     0x0000,0x0000,
  378.     0x640 ,0x180 ,0x1e30,0x11c0,0x3f38,0xbe8 ,0x7e0c,0x7ffc,
  379.     0x7e7c,0x3f8c,0xfd2e,0xfed6,0x9884,0xff7e,0x9982,0xfe7e,
  380.     0x406 ,0xfffe,0x606 ,0xfffe,0x4544,0x3bbc,0x4104,0x3ffc,
  381.     0xf00 ,0x30f8,0xe70 ,0x1180,0x580 ,0x240 ,0x0   ,0x0   ,
  382.     0x0000,0x0000 };
  383.  
  384. UWORD chip Ball13SprData[] = {
  385.     0x0000,0x0000,
  386.     0x6c0 ,0x100 ,0x1c70,0x390 ,0x3e78,0x17d8,0x7c1c,0x7ff8,
  387.     0x78fc,0x7f1c,0xf26c,0xfd9e,0x7408,0xfffe,0x5200,0xfdfe,
  388.     0x41e ,0xfbfe,0x81e ,0xfff8,0x1e9c,0x6778,0x64c ,0x7fbc,
  389.     0x3e08,0x1f8 ,0x1cf0,0x300 ,0x600 ,0x1c0 ,0x0   ,0x0   ,
  390.     0x0000,0x0000 };
  391.  
  392. UWORD chip Ball14SprData[] = {
  393.     0x0000,0x0000,
  394.     0x4c0 ,0x300 ,0x18f0,0x720 ,0x3df8,0xfb8 ,0x7878,0x7ff4,
  395.     0x71f8,0x7e7c,0xe978,0xf6be,0xc426,0xfbf8,0x4c10,0xf3fe,
  396.     0x203c,0xfffe,0x303c,0xfff6,0x2838,0x5fe4,0x898 ,0x7f7c,
  397.     0x1c10,0x23f8,0x18f0,0x700 ,0x340 ,0x480 ,0x0   ,0x0   ,
  398.     0x0000,0x0000 };
  399.  
  400. UWORD chip Ball15SprData[] = {
  401.     0x0000,0x0000,
  402.     0x5c0 ,0x200 ,0x10f0,0xf40 ,0x3bf0,0x3f78,0x60f4,0x7fe8,
  403.     0x67f0,0x78fc,0x9360,0xecfe,0x204e,0xfff0,0x1004,0xeffa,
  404.     0xa0f8,0xdffe,0xc0f8,0xffce,0x5470,0x3bcc,0x1060,0x7ffc,
  405.     0x3828,0x7f0 ,0x11e0,0xe10 ,0x440 ,0x380 ,0x0   ,0x0   ,
  406.     0x0000,0x0000 };
  407.  
  408. UWORD chip Ball16SprData[] = {
  409.     0x0000,0x0000,
  410.     0x1c0 ,0x600 ,0x1e0 ,0x1f90,0x37e8,0x3ff0,0x41f8,0x7f84,
  411.     0xfe0 ,0x71fc,0x4bc0,0xb5fe,0xa138,0xdfc6,0x6088,0x9ff6,
  412.     0x81e0,0x7ffe,0x1e0 ,0xffbe,0x69e0,0x779c,0x64c0,0x7bfc,
  413.     0x3050,0xfe8 ,0x2c0 ,0x1d30,0x6c0 ,0x100 ,0x0   ,0x0   ,
  414.     0x0000,0x0000 };
  415.  
  416. struct SimpleSprite SprStruct = {
  417.     Ball00SprData, SPRHEIGHT, SPRINITX, SPRINITY, 0 };
  418.  
  419. UWORD *BallSprTable[] = {
  420.     Ball00SprData, Ball01SprData, Ball02SprData, Ball03SprData,
  421.     Ball04SprData, Ball05SprData, Ball06SprData, Ball07SprData,
  422.     Ball08SprData, Ball09SprData, Ball10SprData, Ball11SprData,
  423.     Ball12SprData, Ball13SprData, Ball14SprData, Ball15SprData,
  424.     Ball16SprData, NULL };
  425.  
  426. UWORD    **SprTableTop = BallSprTable;
  427. UWORD    **SprTablePtr = BallSprTable;
  428. UWORD    SprFrameCount = 0;
  429.  
  430. UWORD chip Die00SprData[] = {
  431.   0x0000,0x0000,
  432.   0x3c0 ,0x400 ,0x7c0 ,0x1930,0xfc0 ,0x3bf8,0x7e4 ,0x7e1c,
  433.   0x3f80,0x47fc,0x2600,0xdffe,0x4e2 ,0xff1e,0x200 ,0xfffe,
  434.   0xf86 ,0xfffe,0xf86 ,0xfefe,0x2784,0x5e7c,0x1300,0x6ffc,
  435.   0x178 ,0x3f80,0xfb0 ,0x1040,0x380 ,0x440 ,0x0   ,0x0   ,
  436.   0x0000,0x0000 };
  437.  
  438. UWORD chip Die01SprData[] = {
  439.   0x0000,0x0000,
  440.   0x0   ,0x0   ,0x1c0 ,0x200 ,0x3c0 ,0xc30 ,0x7c0 ,0x1df8,
  441.   0x3e4 ,0x3f1c,0x1f80,0x23fc,0x1300,0x6ffe,0x2e2 ,0x7f1e,
  442.   0x786 ,0x7ffe,0x786 ,0x7ffe,0x1384,0x2f7c,0x900 ,0x37fc,
  443.   0x78  ,0x1f80,0x7b0 ,0x840 ,0x180 ,0x240 ,0x0   ,0x0   ,
  444.   0x0000,0x0000 };
  445.  
  446. UWORD chip Die02SprData[] = {
  447.   0x0000,0x0000,
  448.   0x0   ,0x0   ,0x0   ,0x0   ,0x1e0 ,0x0   ,0x1e0 ,0x690 ,
  449.   0x3e0 ,0xff8 ,0x1e4 ,0x1f1c,0xfc0 ,0x11fc,0x62  ,0x3f9e,
  450.   0x100 ,0x3ffe,0x3c6 ,0x3ffe,0x3c6 ,0x3f7e,0x580 ,0x1bfc,
  451.   0xb8  ,0xfc0 ,0x3d0 ,0x420 ,0x1c0 ,0x20  ,0x0   ,0x0   ,
  452.   0x0000,0x0000 };
  453.  
  454. UWORD chip Die03SprData[] = {
  455.   0x0000,0x0000,
  456.   0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x200 ,0x3c0 ,0x420 ,
  457.   0x7c0 ,0xdf0 ,0xf80 ,0x13f8,0xb00 ,0x37fc,0x2e4 ,0x3f1c,
  458.   0x78c ,0x3ffc,0x78c ,0x3ffc,0xb88 ,0x1778,0x70  ,0xf80 ,
  459.   0x7a0 ,0x40  ,0x180 ,0x240 ,0x0   ,0x0   ,0x0   ,0x0   ,
  460.   0x0000,0x0000 };
  461.  
  462. UWORD chip Die04SprData[] = {
  463.   0x0000,0x0000,
  464.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0xc0  ,0x100 ,
  465.   0x1c0 ,0x2b0 ,0x3c0 ,0x6f0 ,0x7c0 ,0x9f8 ,0x500 ,0x1bfc,
  466.   0x0   ,0x1ffc,0x3cc ,0x1ffc,0x5c8 ,0xb38 ,0x80  ,0xff8 ,
  467.   0x3f0 ,0x0   ,0xc0  ,0x100 ,0x0   ,0x0   ,0x0   ,0x0   ,
  468.   0x0000,0x0000 };
  469.  
  470. UWORD chip Die05SprData[] = {
  471.   0x0000,0x0000,
  472.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x0   ,
  473.   0x1c0 ,0x620 ,0x1c0 ,0xf30 ,0x780 ,0x9f0 ,0xc8  ,0x1f38,
  474.   0x388 ,0x1ff8,0x388 ,0x1ff8,0x500 ,0xbf0 ,0x70  ,0x780 ,
  475.   0x180 ,0x40  ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  476.   0x0000,0x0000 };
  477.  
  478. UWORD chip Die06SprData[] = {
  479.   0x0000,0x0000,
  480.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  481.   0x180 ,0x0   ,0x380 ,0x7e0 ,0x780 ,0x1e0 ,0xd0  ,0xf30 ,
  482.   0x390 ,0xff0 ,0x580 ,0x360 ,0x60  ,0x780 ,0x180 ,0x0   ,
  483.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  484.   0x0000,0x0000 };
  485.  
  486. UWORD chip Die07SprData[] = {
  487.   0x0000,0x0000,
  488.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  489.   0x0   ,0x0   ,0x80  ,0x100 ,0x180 ,0x2c0 ,0x300 ,0x5e0 ,
  490.   0x1a0 ,0x7e0 ,0x3a0 ,0x160 ,0x1c0 ,0x0   ,0x0   ,0x0   ,
  491.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  492.   0x0000,0x0000 };
  493.  
  494. UWORD chip Die08SprData[] = {
  495.   0x0000,0x0000,
  496.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  497.   0x0   ,0x0   ,0x0   ,0x0   ,0xc0  ,0x0   ,0xc0  ,0x1a0 ,
  498.   0x40  ,0x3a0 ,0x80  ,0x3e0 ,0x60  ,0x180 ,0x0   ,0x0   ,
  499.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  500.   0x0000,0x0000 };
  501.  
  502. UWORD chip Die09SprData[] = {
  503.   0x0000,0x0000,
  504.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  505.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x80  ,
  506.   0x80  ,0x1c0 ,0x80  ,0xc0  ,0x0   ,0x0   ,0x0   ,0x0   ,
  507.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  508.   0x0000,0x0000 };
  509.  
  510. UWORD chip Die10SprData[] = {
  511.   0x0000,0x0000,
  512.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  513.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x0   ,
  514.   0x1c0 ,0x0   ,0x1c0 ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  515.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  516.   0x0000,0x0000 };
  517.  
  518. UWORD chip Die11SprData[] = {
  519.   0x0000,0x0000,
  520.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  521.   0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x0   ,0x3e0 ,0x0   ,
  522.   0x3e0 ,0x0   ,0x3e0 ,0x0   ,0x1c0 ,0x0   ,0x0   ,0x0   ,
  523.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  524.   0x0000,0x0000 };
  525.  
  526. UWORD chip Die12SprData[] = {
  527.   0x0000,0x0000,
  528.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x80  ,0x0   ,
  529.   0x80  ,0x0   ,0x1c0 ,0x0   ,0x3e0 ,0x0   ,0x7f0 ,0x0   ,
  530.   0x1ffc,0x0   ,0x7f0 ,0x0   ,0x3e0 ,0x0   ,0x1c0 ,0x0   ,
  531.   0x80  ,0x0   ,0x80  ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  532.   0x0000,0x0000 };
  533.  
  534. UWORD chip Die13SprData[] = {
  535.   0x0000,0x0000,
  536.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  537.   0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x0   ,0x3e0 ,0x0   ,
  538.   0x3e0 ,0x0   ,0x3e0 ,0x0   ,0x1c0 ,0x0   ,0x0   ,0x0   ,
  539.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  540.   0x0000,0x0000 };
  541.  
  542. UWORD chip Die14SprData[] = {
  543.   0x0000,0x0000,
  544.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  545.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x1c0 ,0x0   ,
  546.   0x1c0 ,0x0   ,0x1c0 ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  547.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  548.   0x0000,0x0000 };
  549.  
  550. UWORD chip Die15SprData[] = {
  551.   0x0000,0x0000,
  552.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  553.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x80  ,0x0   ,
  554.   0x1c0 ,0x0   ,0x80  ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  555.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  556.   0x0000,0x0000 };
  557.  
  558. UWORD chip Die16SprData[] = {
  559.   0x0000,0x0000,
  560.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  561.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  562.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  563.   0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,0x0   ,
  564.   0x0000,0x0000 };
  565.  
  566. UWORD *DieSprTable[] = {
  567.     Die00SprData, Die01SprData, Die02SprData, Die03SprData,
  568.     Die04SprData, Die05SprData, Die06SprData, Die07SprData,
  569.     Die08SprData, Die09SprData, Die10SprData, Die11SprData,
  570.     Die12SprData, Die13SprData, Die14SprData, Die15SprData,
  571.     Die16SprData, NULL };
  572.  
  573. /************************************************************************
  574. *******************************  MAIN()  ********************************
  575. *************************************************************************/
  576.  
  577. void main(void)
  578.  
  579. {
  580. char                *errmsg;
  581. struct IntuiMessage    *imsg;
  582. ULONG                class;
  583. UWORD                code;
  584. APTR                iaddr;
  585. BOOL                done = FALSE;
  586.  
  587. if (!(errmsg = OpenAll()))
  588.     {
  589.     while (!done)
  590.         {
  591.         if (SprDead)
  592.             Wait(MainISigs);
  593.         else
  594.             {
  595.             WaitTOF();
  596.             MoveBall();
  597.             }
  598.  
  599.         while (imsg = GT_GetIMsg(MainIPort))
  600.             {
  601.             class = imsg->Class;
  602.             code = imsg->Code;
  603.             iaddr = imsg->IAddress;
  604.             GT_ReplyIMsg(imsg);
  605.  
  606.             switch(class)
  607.                 {
  608.                 case IDCMP_GADGETUP:
  609.                     HandleGadget((struct Gadget *)iaddr,code);
  610.                     break;
  611.  
  612.                 case IDCMP_MENUPICK:
  613.                     done = HandleMenu(code);
  614.                     break;
  615.  
  616.                 case IDCMP_REFRESHWINDOW:
  617.                     GT_BeginRefresh(MainWindow);
  618.                     GT_EndRefresh(MainWindow,TRUE);
  619.                     break;
  620.  
  621.                 case IDCMP_CLOSEWINDOW:
  622.                     done = TRUE;
  623.                     break;
  624.  
  625.                 default:
  626.                     break;
  627.  
  628.                 } /* endswitch class */
  629.             }    /* endwhile imsg */
  630.         } /* endwhile !done */
  631.     } /* endif OpenAll'd */
  632.  
  633. CloseAll(errmsg);
  634. }
  635.  
  636. /************************************************************************
  637. ***************************  HANDLEGADGET()  ****************************
  638. *************************************************************************/
  639.  
  640. void HandleGadget(struct Gadget *gad,UWORD code)
  641.  
  642. {
  643. switch(gad->GadgetID)
  644.     {
  645.     case GAD_FRICTION:
  646.         Friction = 0.9 + (100 - code)/1000.0;
  647.         break;
  648.  
  649.     case GAD_BOUNCE:
  650.         Bounce = code/100.0;
  651.         break;
  652.  
  653.     case GAD_FORCE:
  654.         Force = code/100.0;
  655.         break;
  656.  
  657.     default:
  658.         break;
  659.     }
  660. }
  661.  
  662. /************************************************************************
  663. ****************************  HANDLEMENU()  *****************************
  664. *************************************************************************/
  665.  
  666. BOOL HandleMenu(UWORD code)
  667. {
  668. BOOL quit = FALSE;
  669.  
  670. if (MENUNUM(code) == MENU_PROJECT)
  671.     {
  672.     switch(ITEMNUM(code))
  673.         {
  674.         case ITEM_ABOUT:
  675.             EasyRequestArgs(MainWindow,&EasyAbout,NULL,NULL);
  676.             break;
  677.  
  678.         case ITEM_NEW:
  679.             DisableNewItem();
  680.             SprDead = FALSE; SprAlive = TRUE;
  681.             SprX = SPRINITX; SprY = SPRINITY;
  682.             SprSpeed = SPRINITSPEED; SprTheta = SPRINITTHETA;
  683.             SprTableTop = SprTablePtr = BallSprTable;
  684.             SprFrameCount = 0;
  685.             break;
  686.  
  687.         case ITEM_QUIT:
  688.             quit = TRUE;
  689.             break;
  690.  
  691.         default:
  692.             break;
  693.         }
  694.     }
  695.  
  696. return(quit);
  697. }
  698.  
  699. /************************************************************************
  700. ***************************  ENABLENEWITEM()  ***************************
  701. *************************************************************************/
  702.  
  703. #define NEWITEMNUM    SHIFTMENU(MENU_PROJECT)|SHIFTITEM(ITEM_NEW)|SHIFTSUB(NOSUB)
  704.  
  705. void EnableNewItem(void)
  706.  
  707. {
  708. struct MenuItem    *mi;
  709.  
  710. ClearMenuStrip(MainWindow);
  711. mi = ItemAddress(MainMenu,NEWITEMNUM);
  712. mi->Flags |= ITEMENABLED;
  713. ResetMenuStrip(MainWindow,MainMenu);
  714. }
  715.  
  716. /************************************************************************
  717. **************************  DISABLENEWITEM()  ***************************
  718. *************************************************************************/
  719.  
  720. void DisableNewItem(void)
  721.  
  722. {
  723. struct MenuItem    *mi;
  724.  
  725. ClearMenuStrip(MainWindow);
  726. mi = ItemAddress(MainMenu,NEWITEMNUM);
  727. mi->Flags &= ~ITEMENABLED;
  728. ResetMenuStrip(MainWindow,MainMenu);
  729. }
  730.  
  731. /************************************************************************
  732. ******************************  OPENALL()  ******************************
  733. *************************************************************************
  734. * Open libraries, window, etc. Return error msg on failure, else
  735. * return NULL.
  736. *************************************************************************/
  737.  
  738. char *OpenAll(void)
  739.  
  740. {
  741. struct ViewPort    *vp;
  742.  
  743. if (!(IntuitionBase = (struct IntuitionBase *)
  744.     OpenLibrary("intuition.library",37)))
  745.         return("No Intuition V37 !");
  746.  
  747. if (!(GfxBase = (struct GfxBase *)
  748.     OpenLibrary("graphics.library",37)))
  749.         return("No Graphics !");
  750.  
  751. if (!(GadToolsBase = OpenLibrary("gadtools.library",37)))
  752.     return("No GadTools !");
  753.  
  754. if (!(ScreenLock = LockPubScreen(NULL)))
  755.     return("No default screen !");
  756.  
  757. if (!(VisualInfo = GetVisualInfoA(ScreenLock,NULL)))
  758.     return("No visual info !");
  759.  
  760. if (!(MainWindow = OpenWindowTagList(NULL,WindowTags)))
  761.     return("No window !");
  762.  
  763. MainIPort = MainWindow->UserPort;
  764. MainISigs = 1L<<(MainIPort->mp_SigBit);
  765.  
  766. if (!CreateGadgetList(MainGadgetProg,VisualInfo))
  767.     return("No gadgets !");
  768.  
  769. AddGList(MainWindow,MainGList,~0,-1,NULL);
  770. MainGadgetsAdded = TRUE;
  771. RefreshGList(MainGList,MainWindow,NULL,-1);
  772. GT_RefreshWindow(MainWindow,NULL);
  773.  
  774. if (!(MainMenu = CreateMenus(MainNewMenu,GTMN_FrontPen,0L,TAG_DONE)))
  775.     return("No menus !");
  776.  
  777. LayoutMenus(MainMenu,VisualInfo,GTMN_TextAttr,&TopazAttr,TAG_DONE);
  778. SetMenuStrip(MainWindow,MainMenu);
  779.  
  780. if (GetSprite(&SprStruct,SPRNUMBER) < 0)
  781.     return("No sprite !");
  782.  
  783. GotSprite = TRUE;
  784. ChangeSprite(NULL,&SprStruct,(void *)Ball00SprData);
  785.  
  786. vp = &ScreenLock->ViewPort;
  787. SetRGB4(vp,21,PEN21RED,PEN21GREEN,PEN21BLUE);
  788. SetRGB4(vp,22,PEN22RED,PEN22GREEN,PEN22BLUE);
  789. SetRGB4(vp,23,PEN23RED,PEN23GREEN,PEN23BLUE);
  790.  
  791. MouseX = IntuitionBase->MouseX;
  792. MouseY = IntuitionBase->MouseY;
  793.  
  794. custom.clxcon = 0;
  795.  
  796. return(NULL);
  797. }
  798.  
  799. /************************************************************************
  800. *************************  CREATEGADGETLIST()  **************************
  801. *************************************************************************
  802. * Create a list of gadtools gadgets using supplied "GadProgItem" array.
  803. * This is similar to a taglist, but is "interpreted" in sequence.
  804. * Each gadprogitem ID tells the function to perform some particular act
  805. * with the data field. Specifically...
  806. *
  807. * GADPROG_CONTEXT    Create new context with GList ptr pointed to by data.
  808. * GADPROG_LEFT        Set newgadget LeftEdge for next "create" call.
  809. * GADPROG_TOP        Set ng.TopEdge.
  810. * GADPROG_WIDTH        Set ng.Width.
  811. * GADPROG_HEIGHT    Set ng.Height.
  812. * GADPROG_TEXT        Set ng.GadgetText.
  813. * GADPROG_GID        Set ng.GadgetID.
  814. * GADPROG_FLAGS        Set ng.Flags.
  815. * GADPROG_TATTR        Set ng.TextAttr.
  816. * GADPROG_KIND        Set the kind of gadget to create.
  817. * GADPROG_TAGPTR    Set the taglist ptr for the gadget to create.
  818. * GADPROG_CREATE    Call CreateGadgetA and store the result at data.
  819. *
  820. * Values are cached between calls to create, so don't have to be repeated
  821. * for each gadget. A value _must_ be specified for _each_ field, however,
  822. * for the first gadget created by a program. Several sets of gadgets may
  823. * be created by repeated use of GADPROG_CONTEXT.
  824. *
  825. * The routine does all the success checking & will abort & return false
  826. * if a create or context call fails.
  827. *
  828. ****************************************************************************/
  829.  
  830. BOOL CreateGadgetList(struct GadProgItem *pc,APTR vi)
  831.  
  832. {
  833. struct NewGadget    ng;
  834. struct Gadget        *g = NULL;
  835. struct TagItem        *tagptr = NULL;
  836. ULONG                kind,data;
  837.  
  838. ng.ng_VisualInfo = vi;
  839.  
  840. while (pc->gpi_Tag != GADPROG_DONE)
  841.     {
  842.     data = pc->gpi_Data;
  843.     switch (pc->gpi_Tag)
  844.         {
  845.         case GADPROG_CONTEXT:
  846.             g = CreateContext( (struct Gadget **) data);
  847.             if (g == 0) return(FALSE);
  848.             break;
  849.  
  850.         case GADPROG_LEFT:
  851.             ng.ng_LeftEdge = data;
  852.             break;
  853.  
  854.         case GADPROG_TOP:
  855.             ng.ng_TopEdge = data;
  856.             break;
  857.  
  858.         case GADPROG_WIDTH:
  859.             ng.ng_Width = data;
  860.             break;
  861.  
  862.         case GADPROG_HEIGHT:
  863.             ng.ng_Height = data;
  864.             break;
  865.  
  866.         case GADPROG_TEXT:
  867.             ng.ng_GadgetText = (UBYTE *) data;
  868.             break;
  869.  
  870.         case GADPROG_GID:
  871.             ng.ng_GadgetID = data;
  872.             break;
  873.  
  874.         case GADPROG_FLAGS:
  875.             ng.ng_Flags = data;
  876.             break;
  877.  
  878.         case GADPROG_TATTR:
  879.             ng.ng_TextAttr = (struct TextAttr *) data;
  880.             break;
  881.  
  882.         case GADPROG_KIND:
  883.             kind = data;
  884.             break;
  885.  
  886.         case GADPROG_TAGPTR:
  887.             tagptr = (struct TagItem *) data;
  888.             break;
  889.  
  890.         case GADPROG_CREATE:
  891.             g = CreateGadgetA(kind,g,&ng,tagptr);
  892.             * ((struct Gadget **) data) = g;
  893.             if (g == 0) return(FALSE);
  894.             break;
  895.  
  896.         default:
  897.             return(FALSE);
  898.  
  899.         } /* endswitch tag */
  900.  
  901.     pc++;                            /* next tag item */
  902.  
  903.     } /* endwhile !GADPROG_DONE */
  904.  
  905. return(TRUE);
  906. }
  907.  
  908. /************************************************************************
  909. *****************************  CLOSEALL()  ******************************
  910. *************************************************************************
  911. * Undo whatever OpenAll() did, then exit (displaying the supplied errmsg
  912. * if one was given).
  913. *************************************************************************/
  914.  
  915. void CloseAll(errmsg)
  916. char    *errmsg;
  917.  
  918. {
  919. if (GotSprite) FreeSprite(SPRNUMBER);
  920. if (MainMenu)
  921.     {
  922.     ClearMenuStrip(MainWindow);
  923.     FreeMenus(MainMenu);
  924.     }
  925. if (MainGadgetsAdded) RemoveGList(MainWindow,MainGList,-1);
  926. if (MainGList) FreeGadgets(MainGList);
  927. if (MainWindow) CloseWindow(MainWindow);
  928. if (VisualInfo) FreeVisualInfo(VisualInfo);
  929. if (ScreenLock) UnlockPubScreen(NULL,ScreenLock);
  930. if (GadToolsBase) CloseLibrary(GadToolsBase);
  931. if (GfxBase) CloseLibrary( (struct Library *) GfxBase);
  932. if (IntuitionBase) CloseLibrary( (struct Library *) IntuitionBase);
  933.  
  934. if (errmsg) printf("%s\n",errmsg);
  935.  
  936. exit(0);
  937. }
  938.  
  939. /************************************************************************
  940. *****************************  MOVEBALL()  ******************************
  941. *************************************************************************/
  942.  
  943. void MoveBall(void)
  944. {
  945. double    dx,dy;
  946.  
  947. MouseDX = IntuitionBase->MouseX - MouseX;
  948. MouseDY = IntuitionBase->MouseY - MouseY;
  949. MouseX = IntuitionBase->MouseX;
  950. MouseY = IntuitionBase->MouseY;
  951.  
  952. if (SprAlive && (custom.clxdat & SPRCOLLMASK))    /* hit with mouse pointer */
  953.     {
  954.     if ((MouseDX != 0) || (MouseDY !=0 ))
  955.         {
  956.         dx = SprSpeed * cos(SprTheta) + Force * MouseDX;
  957.         dy = - SprSpeed * sin(SprTheta) - Force * MouseDY;
  958.         SprSpeed = sqrt(dx*dx + dy*dy);
  959.         SprTheta = atan2(dy,dx);
  960.         if (SprTheta < 0) SprTheta += PI*2;
  961.         }
  962.     }
  963.  
  964. if (SprAlive && (SprSpeed > 0))
  965.     {
  966.     SprX += SprSpeed * cos(SprTheta);
  967.     SprY -= SprSpeed * sin(SprTheta);
  968.     SprSpeed *= Friction;
  969.  
  970.     if (SprX <= 0)                            /* hit left hand side of view */
  971.         {
  972.         if (SprTheta <= PI)
  973.             SprTheta = PI - SprTheta;        /* going "up" */
  974.         else
  975.             SprTheta = 3*PI - SprTheta;        /* going "down" */
  976.         SprSpeed *= Bounce;
  977.         SprX = 0;
  978.         }
  979.  
  980.     if (SprX >= VIEWWIDTH - SPRWIDTH)        /* hit right hand side of view */
  981.         {
  982.         if (SprTheta <= PI/2)
  983.             SprTheta = PI - SprTheta;        /* going "up" */
  984.         else
  985.             SprTheta = 3*PI - SprTheta;        /* going "down" */
  986.         SprSpeed *= Bounce;
  987.         SprX = VIEWWIDTH - SPRWIDTH;
  988.         }
  989.  
  990.     if (SprY <= 0)                            /* hit top side of view */
  991.         {
  992.         if (SprTheta <= PI/2)
  993.             SprTheta = 2*PI - SprTheta;        /* going "right" */
  994.         else
  995.             SprTheta = 2*PI - SprTheta;        /* going "left" */
  996.         SprSpeed *= Bounce;
  997.         SprY = 0;
  998.         }
  999.  
  1000.     if (SprY >= VIEWHEIGHT - SPRHEIGHT)        /* hit bottom side of view */
  1001.         {
  1002.         if (SprTheta >= 3*PI/2)
  1003.             SprTheta = 2*PI - SprTheta;        /* going "right" */
  1004.         else
  1005.             SprTheta = 2*PI - SprTheta;        /* going "left" */
  1006.         SprSpeed *= Bounce;
  1007.         SprY = VIEWHEIGHT - SPRHEIGHT;
  1008.         }
  1009.  
  1010.     MoveSprite(NULL,&SprStruct,(WORD)SprX,(WORD)SprY);
  1011.     }
  1012.  
  1013. if (SprAlive)
  1014.     {
  1015.     if ((SprX >= VIEWWIDTH-SPRWIDTH-4) && (SprY <= 4))
  1016.         {
  1017.         SprAlive = FALSE;
  1018.         SprTablePtr = DieSprTable;
  1019.         SprTableTop = NULL;
  1020.         }
  1021.     }
  1022.  
  1023. if (SprTablePtr && (++SprFrameCount == SPRFRAMECOUNT))
  1024.     {
  1025.     SprFrameCount = 0;
  1026.     SprTablePtr++;
  1027.     if (*SprTablePtr == NULL) SprTablePtr = SprTableTop;
  1028.     if (SprTablePtr)
  1029.         ChangeSprite(NULL,&SprStruct,(void *)(*SprTablePtr));
  1030.     else
  1031.         {
  1032.         SprDead = TRUE;
  1033.         EnableNewItem();
  1034.         }
  1035.     }
  1036. }
  1037.  
  1038.  
  1039.